/**
 * Copyright (C) 2016-2016 iNote.
 * ================================================================
 * ProjectName: inote
 * FileName: DateTimeUtils.java
 * Created: 2016�?4�?2�? 下午10:17:29 by XQF SUI
 * ================================================================
 */

package sui.utils.date;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.slf4j.Logger;

import sui.utils.logs.LogUtils;

/**
 * <p>
 * Description: 日期时间工具�?
 * <p>
 * @author XQF SUI
 * <p>
 * Create Date: 2016�?4�?2�? 下午10:17:29
 * <p>
 * @version 1.0
 */
public class DateTimeUtils {
    
    private static Logger logger = LogUtils.get();
    // 时间短格�?
    private static final String TIME_FORMAT_SHORT = "yyyyMMddHHmmss";
    // 时间默认格式
    private static final String TIME_FORMAT_NORMAL = "yyyy-MM-dd HH:mm:ss";
    // 英文格式时间
    private static final String TIME_FORMAT_ENGLISH = "MM/dd/yyyy HH:mm:ss";
    // 中国格式时间
    private static final String TIME_FORMAT_CHINA = "yyyy年MM月dd日 HH时mm分ss秒";
    // 中国格式短时�?
    private static final String TIME_FORMAT_CHINA_S = "yyyy年M月d日 H时m分s秒";
    
    private static final String TIME_FORMAT_LONG = "yyyy-MM-dd HH:mm:ss E";
    // 日期短格�?
    private static final String DATE_FORMAT_SHORT = "yyyyMMdd";
    // 日期默认格式
    private static final String DATE_FORMAT_NORMAL = "yyyy-MM-dd";
    // 英文格式日期
    private static final String DATE_FORMAT_ENGLISH = "MM/dd/yyyy";
    // 中国格式日期
    private static final String DATE_FORMAT_CHINA = "yyyy年MM月dd日";
    
    private static final String MONTH_DAY_FORMAT = "MM-dd";
    
    private static final String DATE_FORMAT_MINUTE = "yyyyMMddHHmm";

    private static final SimpleDateFormat FORMAT = new SimpleDateFormat(DATE_FORMAT_NORMAL);
    
    private static final long SECOND = 1000L;
    
    private static final long MINUTE = 60L * SECOND;
    
    private static final long HOUR = 60L * MINUTE;
    
    private static final long DAY = 24L * HOUR;
    
    
    // ------------------------------------ TIME FORMAT ------------------------------------
    
    /**
     * <p>
     * Description:根据时间获取 <b>yyyyMMddHHmmss</b> 格式字符�?
     * <p>
     * Author XQF SUI
     * <p>
     * Create Date: 2016�?4�?2�? 下午11:40:33
     * @param date
     * @return
     */
    public static String getTimeShortString(Date date) {
        return initDateFormat(TIME_FORMAT_SHORT).format(date);
    }
    
    /**
     * <p>
     * Description:获取现在时间 <b>yyyyMMddHHmmss</b> 格式字符�?
     * <p>
     * Author XQF SUI
     * <p>
     * Create Date: 2016�?4�?2�? 下午11:49:31
     * @return
     */
    public static String getNowTimeShortString() {
        return getTimeShortString(getDate());
    }
    
    /**
     * <p>
     * Description:根据时间获取 <b>yyyy-MM-dd HH:mm:ss</b> 格式字符�?
     * <p>
     * Author XQF SUI
     * <p>
     * Create Date: 2016�?4�?2�? 下午11:52:52
     * @param date
     * @return
     */
    public static String getTimeNormalString(Date date) {
        return initDateFormat(TIME_FORMAT_NORMAL).format(date);
    }
    
    /**
     * <p>
     * Description:获取现在时间 <b>yyyy-MM-dd HH:mm:ss</b> 格式字符�?
     * <p>
     * Author XQF SUI
     * <p>
     * Create Date: 2016�?4�?2�? 下午11:54:28
     * @return
     */
    public static String getNowTimeNormalString() {
        return getTimeNormalString(getDate());
    }
    
    /**
     * <p>
     * Description:根据时间获取 <b>MM/dd/yyyy HH:mm:ss</b> 格式字符�?
     * <p>
     * Author XQF SUI
     * <p>
     * Create Date: 2016�?4�?2�? 下午11:58:41
     * @param date
     * @return
     */
    public static String getTimeEngLishString(Date date) {
        return initDateFormat(TIME_FORMAT_ENGLISH).format(date);
    }
    
    /**
     * <p>
     * Description:获取现在时间 <b>MM/dd/yyyy HH:mm:ss</b> 格式字符�?
     * <p>
     * Author XQF SUI
     * <p>
     * Create Date: 2016�?4�?3�? 上午12:00:27
     * @return
     */
    public static String getNowTimeEngLishString() {
        return getTimeEngLishString(getDate());
    }
    
    /**
     * <p>
     * Description: 根据时间获取 <b>yyyy年MM月dd�? HH:mm:ss</b> 格式字符�?
     * <p>
     * Author XQF SUI
     * <p>
     * Create Date: 2016�?4�?3�? 上午12:03:59
     * @return
     */
    public static String getTimeChinaString(Date date) {
        return initDateFormat(TIME_FORMAT_CHINA).format(date);
    }
    
    /**
     * <p>
     * Description:获取现在时间  <b>yyyy年MM月dd�? HH:mm:ss</b> 格式字符�?
     * <p>
     * Author XQF SUI
     * <p>
     * Create Date: 2016�?4�?3�? 上午12:06:02
     * @return
     */
    public static String getNowTimeChinaString() {
        return getTimeChinaString(getDate());
    }
    
    /**
     * <p>
     * Description: 根据时间获取 <b>yyyy年MM月dd�? HH时mm分ss�?</b> 格式字符�?
     * <p>
     * Author XQF SUI
     * <p>
     * Create Date: 2016�?4�?3�? 上午12:07:59
     * @return
     */
    public static String getTimeChinaSString(Date date) {
        return initDateFormat(TIME_FORMAT_CHINA_S).format(date);
    }
    
    /**
     * <p>
     * Description:获取现在时间  <b>yyyy年MM月dd�? HH:mm:ss</b> 格式字符�?
     * <p>
     * Author XQF SUI
     * <p>
     * Create Date: 2016�?4�?3�? 上午12:09:02
     * @return
     */
    public static String getNowTimeChinaSString() {
        return getTimeChinaSString(getDate());
    }
    
    /**
     * <p>
     * Description:根据时间获取 <b>yyyy-MM-dd HH:mm:ss E</b> 格式字符�?
     * <p>
     * Author XQF SUI
     * <p>
     * Create Date: 2016�?4�?3�? 上午10:34:53
     * @param date
     * @return
     */
    public static String getTimeLongString(Date date) {
        return initDateFormat(TIME_FORMAT_LONG).format(date);
    }
    
    /**
     * <p>
     * Description:获取现在时间 <b>yyyy-MM-dd HH:mm:ss E</b> 格式字符�?
     * <p>
     * Author XQF SUI
     * <p>
     * Create Date: 2016�?4�?3�? 上午10:36:06
     * @return
     */
    public static String getNowTimeLongString() {
        return initDateFormat(TIME_FORMAT_LONG).format(getDate());
    }
    
    // ------------------------------------ DATE FORMAT ------------------------------------
    
    /**
     * <p>
     * Description:获取现在时间
     * <p>
     * Author XQF SUI
     * <p>
     * Create Date: 2016�?4�?2�? 下午10:34:07
     * @return 现在时间
     */
    public static Date getDate() {
        return new Date();
    }
    
    /**
     * <p>
     * Description:初始化时间格�?
     * <p>
     * Author XQF SUI
     * <p>
     * Create Date: 2016�?4�?2�? 下午10:56:00
     * @param formatStr 时间格式字符�?
     * @return DateFormat
     */
    public static DateFormat initDateFormat(String formatStr) {
        return new SimpleDateFormat(formatStr);
    }
    
    /**
     * <p>
     * Description:获取自定义格式时�?
     * <p>
     * Author XQF SUI
     * <p>
     * Create Date: 2016�?4�?2�? 下午11:08:14
     * @param date 时间
     * @param format 时间格式
     * @return 格式化后的时间字符串
     */
    public static String getDateCustomFormat(Date date, String format) {
        return initDateFormat(format).format(date);
    }
    
    /**
     * <p>
     * Description:获取自定义格式的现在时间
     * <p>
     * Author XQF SUI
     * <p>
     * Create Date: 2016�?4�?2�? 下午11:10:56
     * @param format 时间格式
     * @return 格式化后的时间字符串
     */
    public static String getNowDateCustomFormat(String format) {
        return getDateCustomFormat(getDate(), format);
    }
    
    /**
     * <p>
     * Description: 根据时间获取 <b>yyyyMMdd</b> 日期字符�?
     * <p>
     * Author XQF SUI
     * <p>
     * Create Date: 2016�?4�?2�? 下午10:41:37
     * @param date 时间
     * @return 格式化后的时间字符串
     */
    public static String getDateShortString(Date date) {
        return initDateFormat(DATE_FORMAT_SHORT).format(date);
    }
    
    /**
     * <p>
     * Description:获取现在日期 <b>yyyyMMdd</b> 字符�? 
     * <p>
     * Author XQF SUI
     * <p>
     * Create Date: 2016�?4�?2�? 下午10:45:09
     * @return 格式化后的时间字符串
     */
    public static String getNowDateShortString() {
        return getDateShortString(getDate());
    }
    
    /**
     * <p>
     * Description:获取日期 <b>yyyy-MM-dd</b> 格式字符�? 
     * <p>
     * Author XQF SUI
     * <p>
     * Create Date: 2016�?4�?2�? 下午10:37:31
     * @param date
     * @return
     */
    public static String getDateNormalString(Date date) {
        return FORMAT.format(date);
    }
    
    /**
     * <p>
     * Description:获取现在日期 <b>yyyy-MM-dd</b> 格式字符�? 
     * <p>
     * Author XQF SUI
     * <p>
     * Create Date: 2016�?4�?2�? 下午10:21:51
     * @return
     */
    public static String getNowDateNormalString() {
        return getDateNormalString(getDate());
    }
    
    /**
     * <p>
     * Description:根据时间获取 <b>MM/dd/yyyy</b> 格式时间字符�?
     * <p>
     * Author XQF SUI
     * <p>
     * Create Date: 2016�?4�?2�? 下午10:58:14
     * @param date 时间
     * @return 时间字符�?
     */
    public static String getDateEngLishString(Date date) {
        return initDateFormat(DATE_FORMAT_ENGLISH).format(date);
    }
    
    /**
     * <p>
     * Description:获取现在时间 <b>MM/dd/yyyy</b> 格式日期字符�?
     * <p>
     * Author XQF SUI
     * <p>
     * Create Date: 2016�?4�?2�? 下午11:01:00
     * @return
     */
    public static String getNowDateEngLishString() {
        return getDateEngLishString(getDate());
    }
    
    /**
     * <p>
     * Description:获取 <b>yyyy年MM月dd�?</b> 格式日期字符�?  
     * <p>
     * Author XQF SUI
     * <p>
     * Create Date: 2016�?4�?2�? 下午11:17:21
     * @param date
     * @return
     */
    public static String getDateChinaString(Date date) {
        return initDateFormat(DATE_FORMAT_CHINA).format(date);
    }
    
    /**
     * <p>
     * Description:获取现在日期 <b>yyyy年MM月dd�?</b> 格式字符�?  
     * <p>
     * Author XQF SUI
     * <p>
     * Create Date: 2016�?4�?2�? 下午11:28:46
     * @return
     */
    public static String getNowDateChinaString() {
        return initDateFormat(DATE_FORMAT_CHINA).format(getDate());
    }
    
    /**
     * <p>
     * Description:根据时间获取 <b>yyyyMM</b> 格式字符�?
     * <p>
     * Author XQF SUI
     * <p>
     * Create Date: 2016�?4�?3�? 上午10:40:43
     * @return
     */
    public static String getDateMonthString(Date date) {
        return initDateFormat(MONTH_DAY_FORMAT).format(date);
    }
    
    /**
     * <p>
     * Description:获取现在时间 <b>yyyyMM</b> 格式字符�?
     * <p>
     * Author XQF SUI
     * <p>
     * Create Date: 2016�?4�?3�? 上午10:41:59
     * @return
     */
    public static String getNowDateMonthString() {
        return initDateFormat(MONTH_DAY_FORMAT).format(getDate());
    }
    
    // ------------------------------------ Time calculation ------------------------------------
    
    /**
     * <p>
     * Description:获取两个时间之间相差的天�?
     * <p>
     * Author XQF SUI
     * <p>
     * Create Date: 2016�?4�?3�? 上午12:17:44
     * @param date1
     * @param date2
     * @return
     */
    public static Long getIntervalDay(Date date1, Date date2) {
        return (Long) ((date1.getTime() - date2.getTime()) / DAY);
    }
    
    /**
     * <p>
     * Description:获取两个时间之间相差的小时数
     * <p>
     * Author XQF SUI
     * <p>
     * Create Date: 2016�?4�?3�? 上午10:20:35
     * @param date1
     * @param date2
     * @return
     */
    public static Long getIntervalHour(Date date1, Date date2) {
        return (Long) ((date1.getTime() - date2.getTime()) / HOUR);
    }
    
    /**
     * <p>
     * Description:获取两个时间之间相差的分钟数
     * <p>
     * Author XQF SUI
     * <p>
     * Create Date: 2016�?4�?3�? 上午10:20:55
     * @param date1
     * @param date2
     * @return
     */
    public static Long getIntervalMinute(Date date1, Date date2) {
        return (Long) ((date1.getTime() - date2.getTime()) / MINUTE);
    }
    
    /**
     * <p>
     * Description:获取两个时间之间相差的秒�?
     * <p>
     * Author XQF SUI
     * <p>
     * Create Date: 2016�?4�?3�? 上午10:21:15
     * @param date1
     * @param date2
     * @return
     */
    public static Long getIntervalSecond(Date date1, Date date2) {
        return (Long) ((date1.getTime() - date2.getTime()) / SECOND);
    }
    
    /**
     * <p>
     * Description:改变时间
     * <p>
     * Author XQF SUI
     * <p>
     * Create Date: 2016�?4�?3�? 下午1:47:38
     * @param date 原始时间
     * @param field 改变的位�?
     * @param interval 改变的区�?
     * @return
     */
    public static Date changeDate(Date date, int field, int interval) {
        Calendar c = Calendar.getInstance(Locale.CHINA);
        c.setTime(date);
        c.add(field, interval);
        return c.getTime();
    }
    
    /**
     * <p>
     * Description:获取时间之后�? <b>yyyy-MM-dd hh:mm:ss</b> 格式字符�?
     * <p>
     * Author XQF SUI
     * <p>
     * Create Date: 2016�?4�?3�? 下午1:52:00
     * @param date 时间
     * @param interval 区间
     * @return 时间字符�?
     */
    public static String getAfterDateNormalString(Date date, int interval) {
        return getDateNormalString(changeDate(date, Calendar.DATE, interval));
    }
    
    /**
     * <p>
     * Description: 获取当前时间之后�? <b>yyyy-MM-dd hh:mm:ss</b> 格式字符�?
     * <p>
     * Author XQF SUI
     * <p>
     * Create Date: 2016�?4�?3�? 下午1:26:35
     * @param interval 区间
     * @return 时间字符�?
     * 
     */
    public static String getNowAfterDateNormalString(int interval) {
        return getAfterDateNormalString(getDate(), interval);
    }
    
    /**
     * <p>
     * Description:将日期格式字符串转换为时间格�?
     * <p>
     * Author XQF SUI
     * <p>
     * Create Date: 2016�?4�?3�? 下午3:11:54
     * @param dateStr 日期格式字符�?
     * @return
     * @throws ParseException 
     */
    public static Date convertAsDate(String dateStr) {
        try {
            if (dateStr.matches("\\d{14}")) {
                return initDateFormat(TIME_FORMAT_SHORT).parse(dateStr);
            } else if (dateStr.matches("\\d{4}-\\d{1,2}-\\d{1,2} \\d{1,2}:\\d{1,2}:\\d{1,2}")) {
                return initDateFormat(TIME_FORMAT_NORMAL).parse(dateStr);
            } else if (dateStr.matches("\\d{1,2}/\\d{1,2}/\\d{4} \\d{1,2}:\\d{1,2}:\\d{1,2}")) {
                return initDateFormat(TIME_FORMAT_ENGLISH).parse(dateStr);
            } else if (dateStr.matches("\\d{4}" + "年"
                    + "\\d{1,2}" + "月" + "\\d{1,2}"
                    + "日" + " \\d{1,2}"
                    + "时" + "\\d{1,2}"
                    + "分" + "\\d{1,2}"
                    + "秒")) {
                return initDateFormat(TIME_FORMAT_CHINA).parse(dateStr);
            } else if (dateStr.matches("\\d{8}")) {
                return initDateFormat(DATE_FORMAT_SHORT).parse(dateStr);
            } else if (dateStr.matches("\\d{4}-\\d{1,2}-\\d{1,2}")) {
                return initDateFormat(DATE_FORMAT_NORMAL).parse(dateStr);
            } else if (dateStr.matches("\\d{1,2}/\\d{1,2}/\\d{4}")) {
                return initDateFormat(DATE_FORMAT_ENGLISH).parse(dateStr);
            } else if (dateStr.matches("\\d{4}" + "年"
                    + "\\d{1,2}" + "月" + "\\d{1,2}"
                    + "日")) {
                return initDateFormat(DATE_FORMAT_CHINA).parse(dateStr);
            } else if (dateStr.matches("\\d{4}\\d{1,2}\\d{1,2}\\d{1,2}\\d{1,2}")) {
                return initDateFormat(DATE_FORMAT_MINUTE).parse(dateStr);
            }
        } catch (ParseException e) {
            logger.error("Date or Time String is invalid.", e);
        }
        return null;
    }
    
    /**
     * <p>
     * Description:将时间字符串转换�? <b>yyyyMMddhhmmss</b> 格式字符�?
     * <p>
     * Author XQF SUI
     * <p>
     * Create Date: 2016�?4�?3�? 下午3:45:57
     * @param dateStr
     * @return
     */
    public static String convertAsShortDateString(String dateStr) {
        return dateStr == null ? dateStr : dateStr.replaceAll("[-|:|\\s|年|月|日|时|分|秒|/]", "");
    }
    
    /**
     * <p>
     * Description: �? 20160101010101 这样的时间转换为 2016-01-01 01:01:01
     * <p>
     * Author XQF SUI
     * <p>
     * Create Date: 2016�?4�?3�? 下午3:55:34
     * @param dateStr 源时间字符串
     * @return 格式化后的时�?
     */
    public static String convertAsNormalDateString(String dateStr) {
        if (dateStr == null) return null;
        
        try {
            if (dateStr.matches("\\d{8}")) {
                return getDateNormalString(initDateFormat(DATE_FORMAT_SHORT).parse(dateStr));
            }
            
            if (dateStr.matches("\\d{14}")) {
                return getTimeNormalString(initDateFormat(TIME_FORMAT_SHORT).parse(dateStr));
            }
        } catch (ParseException e) {
            throw new IllegalArgumentException(e);
        }
        
        throw new IllegalArgumentException(dateStr + "is invalid,String format is yyyyMMddHHmmss or yyyyMMdd");
    }
    
    /**
     * <p>
     * Description:获得日期集合(按天计算)
     * <p>
     * Author XQF SUI
     * <p>
     * Create Date: 2016�?4�?3�? 下午4:03:07
     * @param beginDate �?始日�?
     * @param endDate 结束日期
     * @return
     * @throws ParseException
     */
    public static List<String> getDateList(String beginDate, String endDate) throws ParseException {
        List<String> list = new ArrayList<String>();
        
        Calendar c1 = Calendar.getInstance(Locale.CHINA);
        c1.setTime(FORMAT.parse(beginDate));
        
        Calendar c2 = Calendar.getInstance(Locale.CHINA);
        c2.setTime(FORMAT.parse(endDate));
        
        int interval = (int) ((c2.getTimeInMillis() - c1.getTimeInMillis()) / DAY);
        
        for (int i = 0; i <= interval; i++) {
            list.add(getDateNormalString(changeDate(convertAsDate(beginDate), Calendar.DATE, i)));
        }
        
        return list;
    }
    
    /**
     * <p>
     * Description:获得输入日期�?在周的第�?�?(周一为第�?�?)
     * <p>
     * Author XQF SUI
     * <p>
     * Create Date: 2016�?4�?3�? 下午5:36:06
     * @param date 时间
     * @return
     * @throws ParseException
     */
    public static String getFirstDayOfWeek(String date) throws ParseException {
        Calendar c1 = Calendar.getInstance(Locale.CHINA);
        
        c1.setTime(FORMAT.parse(date));
        c1.setFirstDayOfWeek(Calendar.MONDAY);
        c1.set(Calendar.DAY_OF_WEEK, c1.getFirstDayOfWeek());
        
        return FORMAT.format(c1.getTime());
    }
    
    /**
     * <p>
     * Description:获得输入日期�?在周的最后一�?(周日为最后一�?)
     * <p>
     * Author XQF SUI
     * <p>
     * Create Date: 2016�?4�?3�? 下午5:39:34
     * @param date
     * @return
     * @throws ParseException
     */
    public static String getLastDayOfWeek(String date) throws ParseException {
        Calendar c1 = Calendar.getInstance(Locale.CHINA);
        
        c1.setTime(FORMAT.parse(date));
        c1.setFirstDayOfWeek(Calendar.MONDAY);
        c1.set(Calendar.DAY_OF_WEEK, c1.getFirstDayOfWeek() + 6);
        
        return FORMAT.format(c1.getTime());
    }
    
    /**
     * <p>
     * Description:计算输入日期�?在月的第�?�?
     * <p>
     * Author XQF SUI
     * <p>
     * Create Date: 2016�?4�?3�? 下午5:46:15
     * @param day
     * @return
     * @throws ParseException
     */
    public static String getFirstDayOfMonth(String day) throws ParseException {
        Calendar c1 = Calendar.getInstance(Locale.CHINA);
        
        c1.setTime(FORMAT.parse(day));
        c1.set(Calendar.DAY_OF_MONTH, 1);
        
        return FORMAT.format(c1.getTime());
    }
    
    /**
     * <p>
     * Description:计算输入日期�?在月的最后一�?
     * <p>
     * Author XQF SUI
     * <p>
     * Create Date: 2016�?4�?3�? 下午5:42:37
     * @param date
     * @return
     * @throws ParseException
     */
    public static String getLastDayOfMonth(String date) throws ParseException {
        Calendar c1 = Calendar.getInstance(Locale.CHINA);
        
        c1.setTime(FORMAT.parse(date));
        c1.set(Calendar.DAY_OF_MONTH, 1);
        c1.add(Calendar.MONTH, 1);
        c1.add(Calendar.DAY_OF_MONTH, -1);
        
        return FORMAT.format(c1.getTime());
    }
    
    /**
     * <p>
     * Description:是否是当月的�?后一�?
     * <p>
     * Author XQF SUI
     * <p>
     * Create Date: 2016�?4�?3�? 下午6:39:05
     * @param date 时间
     * @return
     * @throws ParseException
     */
    public static boolean isLastDayOfMonth(String date) throws ParseException {
        return date.equals(getLastDayOfMonth(date)) ? true : false;
    }
    
    /**
     * <p>
     * Description:是否是当前周的第�?�?
     * <p>
     * Author XQF SUI
     * <p>
     * Create Date: 2016�?4�?3�? 下午6:39:59
     * @param date 时间
     * @return
     * @throws ParseException
     */
    public static boolean isFirstDayOfWeek(String date) throws ParseException {
        return date.equals(getFirstDayOfWeek(date)) ? true : false;
    }
    
    /**
     * <p>
     * Description:是否是当前周的最后一�?
     * <p>
     * Author XQF SUI
     * <p>
     * Create Date: 2016�?4�?3�? 下午6:41:17
     * @param date
     * @return
     * @throws ParseException
     */
    public static boolean isLastDayOfWeek(String date) throws ParseException {
        return date.equals(getLastDayOfWeek(date)) ? true : false;
    }
    
    /**
     * <p>
     * Description:计算输入日期�?在周是否跨月
     * <p>
     * Author XQF SUI
     * <p>
     * Create Date: 2016�?4�?3�? 下午6:41:58
     * @param date 时间
     * @return
     * @throws ParseException
     */
    public static boolean isDayBetweenMonthAndWeek(String date) throws ParseException {
        String firstDayOfMonth = getFirstDayOfMonth(date);
        String firstDayOfWeek = getFirstDayOfWeek(date);
        
        Pattern p = Pattern.compile("\\d{4}-\\d{2}-01");
        Matcher m = p.matcher(date);
        
        if (firstDayOfWeek.compareTo(firstDayOfMonth) < 0 && !m.matches()) {
            return true;
        } else {
            return false;
        }
    }
    
    /**
     * <p>
     * Description:输入的日期是否为时间格式
     * <p>
     * Author XQF SUI
     * <p>
     * Create Date: 2016�?4�?3�? 下午6:46:35
     * @param input
     * @return
     */
    public static boolean isInputDate(String input) {
        return input.matches("\\d{4}-\\d{1,2}-\\d{1,2}");
    }
    
    /**
     * <p>
     * Description:输入的日期是否为 <b>yyyy-MM-dd hh:mm:ss</b> 日期格式
     * <p>
     * Author XQF SUI
     * <p>
     * Create Date: 2016�?4�?3�? 下午6:47:17
     * @param input
     * @return
     */
    public static boolean isInputDateNormalString(String input) {
        return input.matches("\\d{4}-\\d{2}-\\d{2}");
    }
    
    /**
     * <p>
     * Description:将日期字符串格式化为yyyy-MM-dd
     * <p>
     * Author XQF SUI
     * <p>
     * Create Date: 2016�?4�?3�? 下午6:58:57
     * @param input
     * @return
     * @throws IllegalArgumentException
     */
    public static String formatDateString(String input) throws IllegalArgumentException {
        String month = "";
        String day = "";
        
        try {
            if (!isInputDate(input)) {
                throw new IllegalArgumentException("Illegal date format!");
            }
        
            if (isInputDateNormalString(input)) {
                return input;
            }
            
            month = input.substring(input.indexOf("-") + 1, input.lastIndexOf("-"));
            
            if (month.length() == 1 && month.indexOf("0") != 0) {
                month = "0" + month;
            }
            
            day = input.substring(input.lastIndexOf("-") + 1, input.length());
            
            if (day.length() == 1 && day.indexOf("0") != 0) {
                day = "0" + day;
            }
        } catch (Exception e) {
            logger.error("日期转换失败", e);
            return input;
        }
        return input.substring(0, 4) + "-" + month + "-" + day;
    }
    
    /**
<<<<<<< HEAD
     * Description:比较两个日期相差的天�?
     * 
     * @param date1
     *            日期
     * @param date2
     *            日期
     * @return int
     * @throws
     * @Author XQF SUI
     */
    public static int getDay(Date date1, Date date2) {
        long day = 24L * 60L * 60L * 1000L;
        long d1 = date1.getTime();
        long d2 = date2.getTime();
        return (int) ((d2 - d1) / day);
    }

    /**
     * Description:获取日期字符�? yyyy-MM-dd HH:mm:ss 格式�?
     * 
     * @param dateTime
     *            日期
     * @return String
     * @throws
     * @Author XQF SUI
     */
    public static String getDateToString(Date dateTime) {
        DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String str = format.format(dateTime);
        return str;
    }

    /**
     * Description:比较两个日期天数
     * 
     * @param strBegin
     *            �?始时�?
     * @param strEnd
     *            结束时间
     * @return int
     * @throws
     * @Author XQF SUI
     */
    public int getDifferDays(String strBegin, String strEnd) {
        SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd");
        Date date1 = null, date2 = null;
        int days = 0;
        try {
            date1 = f.parse(strBegin);
            date2 = f.parse(strEnd);
            days = (int) ((date2.getTime() - date1.getTime()) / 86400000);
        } catch (Exception e) {
        	logger.error("日期比较失败", e);
        }
        return days;
    }

    /**
     * Description:年月日加上时分秒
     * 
     * @param date
     *            日期
     * @param map
     *            map
     * @param keyName
     *            key
     * @throws ParseException
     *             转换异常�?
     * @Author XQF SUI
     */
    public static void setDateHms(String date, Map<String, Object> map, String keyName)
            throws ParseException {
        if (date != null && date.length() > 0) {
            date = date.trim() + " 00:00:00";
            map.put(keyName, org.apache.commons.lang3.time.DateUtils.parseDate(date,
                    new String[] {"yyyy-MM-dd HH:mm:ss"}));
        }
    }

    /**
     * Description:年月日加上时分秒,并且日期加一�?.
     * 
     * @param date
     *            日期
     * @param map
     *            map
     * @param keyName
     *            key
     * @throws ParseException
     *             转换异常�?
     * @Author XQF SUI
     */
    public static void setDateHmsAddOneDay(String date, Map<String, Object> map, String keyName)
            throws ParseException {
        if (date != null && date.length() > 0) {
            date = date.trim() + " 00:00:00";
            Calendar end = Calendar.getInstance();
            end.setTime(org.apache.commons.lang3.time.DateUtils.parseDate(date,
                    new String[] {"yyyy-MM-dd HH:mm:ss"}));
            end.add(Calendar.DAY_OF_MONTH, 1);
            map.put(keyName, end.getTime());
        }
    }

    /**
     * <p>
     * Description:比较两个日期大小
     * <p>
     * Author XQF SUI
     * <p>
     * Create Date: 2016�?4�?3�? 下午9:48:59
     * @param date1 第一时间
     * @param date2 第二时间
     * @return 1 大于  -1 小于  0 等于
     */
    public static int compareDate(Date date1, Date date2) {
        if (date1.getTime() > date2.getTime()) {
            return 1;
        } else if (date1.getTime() < date2.getTime()) {
            return -1;
        } else {
            return 0;
        }
    }
    
    /**
     * <p>
     * Description:获得某月的最后一�?
     * <p>
     * Author XQF SUI
     * <p>
     * Create Date: 2016�?4�?3�? 下午9:51:16
     * @param date 时间
     * @return
     */
    public static Date getLastDayOfMonth(Date date) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.set(Calendar.DAY_OF_MONTH, 1);
        cal.roll(Calendar.DAY_OF_MONTH, -1);
        return cal.getTime();
    }
    
    /**
     * <p>
     * Description:取得给定日期n个月后的日期
     * <p>
     * Author XQF SUI
     * <p>
     * Create Date: 2016�?4�?3�? 下午10:40:48
     * @param date
     * @param n
     * @return
     */
    public static String getNextNMonth(Date date, int n) {
        return getDateNormalString(changeDate(date, Calendar.MONTH, n));
    }
}
